package com.itlong.cloud.utils.encrypt;

import java.io.File;


/**
 * <desc>
 *      腾讯ECC引擎：由于libtencentECC.so中相关,包路径代码必须写死,本java文件必须放置在 com.itlong.bluetooth.common.utils 路径下
 *      （除非重新编译libtencentECC并修改相关路径），否则会抛异常；
 *      且 libtencentECC.so在服务器中的存放路径尽量标准化，尽量不要用带有 _ -等非法字符的路径
 * <desc/>
 * @author Biao.R
 * @createDate 2017/12/8
 */
public class TencentECCEngine {
	
	static
	{
        String libFile = "/opt/staticfile/tencent/libtencentECC.so";
		try {
			//System.loadLibrary("tencentECC");

            if (!new File(libFile).exists()) {  //腾讯QQ物联库文件不存在
                System.out.println(libFile + "不存在");
            }
			System.load(libFile);
		} catch (Exception e) {
            System.out.println("加载" + libFile + "失败" + e.getMessage());
		}
		
	}

	/**
   	* 生成ECDSA公钥和私钥文件存于指定路径下
   	*strFilePath    :  存放公钥(public.pem)和私钥(Private.pem)的路径
   	*/
	public static native int CreateECDSAKey(String strFilePath);

	/**
   	* 根据key签名一段数据并返回结果
   	* strPrivateKeyPath     :  使用的密钥key的路径
   	* strBufferData   :  需要签名的数据
	* 返回值 ： 签名后产生的licence字符串
   	*/
	public static native String ECDSASignToBuffer(String strPrivateKeyPath, String strBufferData);
	
	/**
	* 根据key签名一个文件ence并保存lic到文件
	*  strPrivateKeyPath     :  使用的密钥key的路径
	*  strDataFilePath      ： 文件路径
	*  strLicencePath  ： 签名后产生的licence存放路径
	*/
	public static native int ECDSASignFileToLicenceFile(String strPrivateKeyPath, String strDataFilePath, String strLicencePath);

	/**
   	* 根据key签名一段数据并保存到文件
   	* strPrivateKeyPath     :  使用的密钥key的路径
   	* strBufferData   :  需要签名的数据
	* strLicencePath  ： 签名后产生的licence存放路径
   	*/
	public static native int ECDSASignBufferToLicenceFile(String strPrivateKeyPath, String strBufferData, String strLicencePath);

	/**
   	* 根据key签名一段数据并编码然后保存到文件
   	* strPrivateKeyPath     :  使用的密钥key的路径
   	* strBufferData   :  需要签名的数据
	* strLicencePath  ： 签名后产生的licence存放路径
   	*/
	public static native int ECDSASignBufferBase16ToLicenceFile(String strPrivateKeyPath, String strBufferData, String strLicencePath);

	/**
   	* 验证一段签名是否合法
   	* strPublicKeyPath     :  使用的公钥key的路径
   	* strBufferData     :  需要验证的数据
	* strLicenceData  ： 签名产生的Licence缓冲区
   	*/
	public static native int ECDSAVerifyLicenceBuffer(String strPublicKeyPath, String strBufferData, String strLicenceData);

	/**
   	* 通过licence文件，公钥key验证一个文件是否合法
   	* strPublicKeyPath :  使用的公钥key的路径
   	* strDataFilePath  :  需要验证的数据文件
	* strLicencePath  ： 签名产生的Licence文件
   	*/
	public static native int ECDSAVerifyLicenceFile(String strPublicKeyPath, String strDataFilePath, String strLicencePath);

	/**
   	* 根据公钥和签名licence验证一个被base16编码过的文件是否合法
	* strPublicKeyPath :  使用的公钥key的路径
	* strDataFilePath  :  需要验证的数据文件
	* strLicencePath  ： 签名产生的Licence文件
   	*/
	public static native int ECDSAVerifyBase16LicenceFile(String strPublicKeyPath, String strDataFilePath, String strLicencePath);

	/**
   	* 根据服务器公钥生成共享密钥，同时生成客户公钥
   	* strSrvPublicKey    :  传入服务器公钥
	* 返回值 ： [共享私钥][客户端公钥]
   	*/
	public static native String[] GetECDHShareKeyFromSrvPublicKey(String strSrvPublicKey);
	
	
	
	/** 创建并验证设备License
	 * 
	 * @param ecKeyFilePath
	 * @param pubKeyFilePath
	 * @param sn
	 * @param
	 * @return
	 * @throws Exception
	 */
	public  String createAndCheckLicesnse(String ecKeyFilePath, String pubKeyFilePath, String sn, String guidSnPath,String licenseFilePath,TencentECCEngine engine)throws Exception {
		engine.ECDSASignBufferBase16ToLicenceFile(ecKeyFilePath, sn, licenseFilePath);
		int ret = engine.ECDSAVerifyBase16LicenceFile(pubKeyFilePath, guidSnPath, licenseFilePath);
		if (ret == 1) {
			System.out.println("ecKeyFilePath--"+ecKeyFilePath+"--pubKeyFilePath--"+pubKeyFilePath);
			System.out.println("--SN--"+sn+"--生成License验证成功");
			return licenseFilePath;
		} else {
			System.out.println("--SN--"+sn+"--生成License验证失败，错误码:" + ret);
		}
		return "";
	}
	
	
	
	
	/*public static void main(String[] args) throws Exception
	{
		TencentECCEngine engine = new TencentECCEngine();
		// 先创建一对公私钥
		*//*
		 * engine.CreateECDSAKey("./output"); // 根据私钥文件ec_key.pem sn 生成
		 * license并编码后保存到文件中
		 * engine.ECDSASignBufferBase16ToLicenceFile("./output/ec_key.pem",
		 * "carol-0000000001", "./output/license.txt"); //
		 * 根据公钥文件public.pem，验证guid.txt中的sn和license.txt是不是匹配 int ret =
		 * engine.ECDSAVerifyBase16LicenceFile("./output/public.pem",
		 * "../guid.txt", "./output/license.txt");
		 *//*
		*//*
		 * String sourceData = "carol-0000000001";
		 * engine.CreateECDSAKey("/home/output");
		 * engine.ECDSASignBufferBase16ToLicenceFile("/home/output/ec_key.pem",
		 * sourceData, "/home/output/license.txt"); int ret =
		 * engine.ECDSAVerifyBase16LicenceFile("/home/output/public.pem",
		 * "/home/output/guid.txt", "/home/output/license.txt");
		 *//*
		*//*
		 * if(ret == 1) { System.out.println("验证成功1"); } else {
		 * System.out.println("验证失败1，错误码:" + ret); }
		 *//*

		// TencentECCEngine engine = new TencentECCEngine();
		*//*
		 * String licensePath =
		 * "/home/itlong/fileserver/license/"+projectId+"/"+sn+".txt"; String
		 * guidPath =
		 * "/home/itlong/fileserver/license/"+projectId+"/"+"guid_"+sn+".txt";
		 * String ecKey =
		 * "/home/itlong/fileserver/keyfile/"+"1700003415_ec_key.pem"; String
		 * pubKey = "/home/itlong/fileserver/keyfile/"+"1700003415_public.pem";
		 * engine.ECDSASignBufferBase16ToLicenceFile(ecKey, sn, licensePath);
		 * int ret2 = engine.ECDSAVerifyBase16LicenceFile(pubKey, guidPath,
		 * licensePath);
		 * 
		 * System.out.println("-----------------2---------------");
		 * System.out.println("licenseFilePath--"+licensePath+"--guidSnPath--"+
		 * guidPath+"--ecKeyFilePath--"+ecKey+"--pubKeyFilePath--"+pubKey);
		 * if(ret2 == 1) { System.out.println("验证成功2"); } else {
		 * System.out.println("验证失败2，错误码:" + ret); }
		 *//*
	}*/
	
	
	
}
